import { Request, Response } from 'express'
import { UserService } from '../services/userService'
import type { CreateUserRequest, UpdateUserRequest } from '../models/User'

const userService = new UserService()

export class UserController {
  // 获取所有用户
  getUsers(req: Request, res: Response): void {
    try {
      const users = userService.getAllUsers()
      res.json({
        success: true,
        data: users
      })
    } catch (error) {
      console.error('Error getting users:', error)
      res.status(500).json({
        success: false,
        message: '获取用户列表失败'
      })
    }
  }

  // 根据ID获取用户
  getUserById(req: Request, res: Response): void {
    try {
      const idParam = req.params.id
      if (!idParam) {
        res.status(400).json({
          success: false,
          message: '用户ID不能为空'
        })
        return
      }

      const id = parseInt(idParam)
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '无效的用户ID'
        })
        return
      }

      const user = userService.getUserById(id)
      if (!user) {
        res.status(404).json({
          success: false,
          message: '用户不存在'
        })
        return
      }

      res.json({
        success: true,
        data: user
      })
    } catch (error) {
      console.error('Error getting user:', error)
      res.status(500).json({
        success: false,
        message: '获取用户信息失败'
      })
    }
  }

  // 创建用户
  createUser(req: Request, res: Response): void {
    try {
      const userData: CreateUserRequest = req.body

      // 验证必填字段
      if (!userData.name || !userData.email || userData.age === undefined) {
        res.status(400).json({
          success: false,
          message: '姓名、邮箱和年龄都是必填字段'
        })
        return
      }

      // 验证邮箱格式
      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
      if (!emailRegex.test(userData.email)) {
        res.status(400).json({
          success: false,
          message: '邮箱格式不正确'
        })
        return
      }

      // 检查邮箱是否已存在
      const emailExists = userService.isEmailExists(userData.email)
      if (emailExists) {
        res.status(400).json({
          success: false,
          message: '邮箱已存在'
        })
        return
      }

      // 验证年龄范围
      if (userData.age < 0 || userData.age > 150) {
        res.status(400).json({
          success: false,
          message: '年龄必须在0-150之间'
        })
        return
      }

      const newUser = userService.createUser(userData)
      res.status(201).json({
        success: true,
        message: '用户创建成功',
        data: newUser
      })
    } catch (error) {
      console.error('Error creating user:', error)
      res.status(500).json({
        success: false,
        message: '创建用户失败'
      })
    }
  }

  // 更新用户
  updateUser(req: Request, res: Response): void {
    try {
      const idParam = req.params.id
      if (!idParam) {
        res.status(400).json({
          success: false,
          message: '用户ID不能为空'
        })
        return
      }

      const id = parseInt(idParam)
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '无效的用户ID'
        })
        return
      }

      const userData: UpdateUserRequest = req.body

      // 检查用户是否存在
      const existingUser = userService.getUserById(id)
      if (!existingUser) {
        res.status(404).json({
          success: false,
          message: '用户不存在'
        })
        return
      }

      // 验证邮箱格式（如果提供）
      if (userData.email) {
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
        if (!emailRegex.test(userData.email)) {
          res.status(400).json({
            success: false,
            message: '邮箱格式不正确'
          })
          return
        }

        // 检查邮箱是否被其他用户使用
        const emailExists = userService.isEmailExists(userData.email, id)
        if (emailExists) {
          res.status(400).json({
            success: false,
            message: '邮箱已被其他用户使用'
          })
          return
        }
      }

      // 验证年龄范围（如果提供）
      if (userData.age !== undefined && (userData.age < 0 || userData.age > 150)) {
        res.status(400).json({
          success: false,
          message: '年龄必须在0-150之间'
        })
        return
      }

      const updatedUser = userService.updateUser(id, userData)
      res.json({
        success: true,
        message: '用户更新成功',
        data: updatedUser
      })
    } catch (error) {
      console.error('Error updating user:', error)
      res.status(500).json({
        success: false,
        message: '更新用户失败'
      })
    }
  }

  // 删除用户
  deleteUser(req: Request, res: Response): void {
    try {
      const idParam = req.params.id
      if (!idParam) {
        res.status(400).json({
          success: false,
          message: '用户ID不能为空'
        })
        return
      }

      const id = parseInt(idParam)
      if (isNaN(id)) {
        res.status(400).json({
          success: false,
          message: '无效的用户ID'
        })
        return
      }

      const deleted = userService.deleteUser(id)
      if (!deleted) {
        res.status(404).json({
          success: false,
          message: '用户不存在'
        })
        return
      }

      res.json({
        success: true,
        message: '用户删除成功'
      })
    } catch (error) {
      console.error('Error deleting user:', error)
      res.status(500).json({
        success: false,
        message: '删除用户失败'
      })
    }
  }
}
